package com.chenkaiwei.eurekaclientfeigndemo;

import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;

/*
在Spring Cloud的Dalston及其之前的版本中：
1. 从2014年的Spring Cloud 1.0.0.RC1版本开始，官方就推荐使用EnableDiscoveryClient来取代EnableEurekaClient；
2. EnableEurekaClient源码中使用了注解EnableDiscoveryClient，因此如果要使用eureka的注册发现服务，两者功能是一样的；
3. EnableDiscoveryClient注解在spring.factories配置中通过配置项EurekaDiscoveryClientConfiguration来开启服务注册发现功能；

在Dalston之后的版本中（不含Dalston）：
1. 在spring.factories配置中，配置类EurekaDiscoveryClientConfiguration被配置到springboot的自动配置注解中，与EnableDiscoveryClient注解没有关系了,也就是说只要开启了springboot的自动配置，服务注册发现功能就会启用；
2. EnableEurekaClient源码中没有使用注解EnableDiscoveryClient，此时EnableEurekaClient已经没用了；

不同点：@EnableEurekaClient只适用于Eureka作为注册中心，@EnableDiscoveryClient 可以是其他注册中心。

*/

@EnableEurekaClient
//@EnableDiscoveryClient //不写也没事，版本进化了
@EnableFeignClients
@SpringBootApplication

//@EnableCircuitBreaker//对hystrix熔断器的支持
//↑ 陈旧语法
//↓ 新语法。且SpringCloudApplication也不再带EnableCircuitBreaker，都是已不推荐的用法。
@EnableHystrix  //https://blog.csdn.net/qq_45225798/article/details/120282627
public class EurekaClientFeignDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaClientFeignDemoApplication.class, args);
    }

//注意:不用加下面的代码也有/actuator/hystrix.stream，应该是新版本又补全了这个功能

//↓ 手动补上actuator/hystrix.stream
// https://www.cnblogs.com/dzhou/p/10517258.html
//    @Bean
//    public ServletRegistrationBean hystrixMetricsStreamServlet() {
//        ServletRegistrationBean registration = new ServletRegistrationBean(new HystrixMetricsStreamServlet());
//        registration.addUrlMappings("/actuator/hystrix");
//        return registration;
//    }


    /**
     * https://blog.csdn.net/xiaojun081004/article/details/84974783
     * 因2.X后的版本不在开放hystrix.stream端点，需要自定义配置
     * @return
     */
//    @Bean
//    public ServletRegistrationBean getServlet(){
//        HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
//        ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
//        registrationBean.setLoadOnStartup(1);
//        registrationBean.addUrlMappings("/actuator/hystrix.stream");
//        registrationBean.setName("HystrixMetricsStreamServlet");
//        return registrationBean;
//    }
}
